Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods - #48886

Merged
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master
Mar 18, 2021
Merged

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods#48886
eiriktsarpalis merged 14 commits into
dotnet:mainfrom
TheBrambleShark:master

Conversation

@TheBrambleShark

Copy link
Copy Markdown
Contributor

Fixes#20064

@ghostghost added the area-System.Linq label Feb 28, 2021
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eiriktsarpalis
See info in area-owners.md if you want to be subscribed.

Issue Details

Fixes #20064

Author:Foxtrek64
Assignees:-
Labels:

area-System.Linq

Milestone:-

@TheBrambleShark

TheBrambleShark commented Feb 28, 2021

Copy link
Copy Markdown
ContributorAuthor

Are the errors here code issues or an issue with changes being synced? I haven't contributed since the dotnet runtime was split across several repositories so I'm not familiar with all that's going on behind the scenes.

Edit: Didn't push ref assemblies. This has been resolved.

Comment threadsrc/libraries/System.Linq/ref/System.Linq.cs Outdated
Base automatically changed from master to mainMarch 1, 2021 09:08
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add unit tests for the new methods as well. Thanks.

Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

Hi @Foxtrek64, have you been able to take a look at PR feedback? Thanks!

Yes. Sorry, I've had a busy few days. I'll implement these changes tomorrow and have them ready for review.

Comment threadsrc/libraries/System.Linq.Queryable/tests/LastOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/SingleOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/tests/LastOrDefaultTests.cs Outdated
eiriktsarpalis
eiriktsarpalis previously approved these changes Mar 11, 2021

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add similar unit tests for the overloads accepting predicates.

@eiriktsarpalis
eiriktsarpalis dismissed their stale reviewMarch 11, 2021 16:13

approved accidentally, PR still has pending feedback

Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq.Queryable/tests/FirstOrDefaultTests.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/First.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
Comment threadsrc/libraries/System.Linq/src/System/Linq/Single.cs Outdated

@eiriktsarpaliseiriktsarpalis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other than some minor changes, LGTM.

Thank you for your contribution!

@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64. Note that there are a few failing unit tests related to these changes. Could you take a look?

@TheBrambleShark

TheBrambleShark commented Mar 15, 2021

Copy link
Copy Markdown
ContributorAuthor

I did notice what I think was a logic error on my part and patched it. Hopefully it resolves the test issues, or at least some of them. I tried testing on my ends but I get strange results, like MissingMethodExceptions even after a build (which does fix some problems). I presume the entire environment has to be built, not just the individual projects.

Edit: I've fixed this issue but now I'm running into issues with the Queryable side of things. After hashing this out in the .Net Foundation Discord, we believe this to be an issue with the BCL itself in that the overload I'm attempting to implement does not exist there. I'm not entirely sure doing something like this is even possible given that it would require splitting things into multiple queries on the BCL side.

I can "fix" it by doing something like this:

[DynamicDependency("FirstOrDefault`1",typeof(Enumerable))]publicstaticTSourceFirstOrDefault<TSource>(thisIQueryable<TSource>source,Expression<Func<TSource,bool>>predicate,TSourcedefaultValue){if(source==null)throwError.ArgumentNull(nameof(source));if(predicate==null)throwError.ArgumentNull(nameof(predicate));usingvarresult=source.Where(predicate).Take(1).GetEnumerator();if(result.MoveNext())returnresult.Current;returndefaultValue;// Skip this stuff/*  return source.Provider.Execute<TSource>( Expression.Call( null, CachedReflectionInfo.FirstOrDefault_TSource_4(typeof(TSource)), source.Expression, Expression.Quote(predicate), Expression.Constant(defaultValue, typeof(TSource)) )); */}

But this is less than ideal for the obvious reason that it cannot be used in the inner part of a query, like this:

varquery=context.SomeTable.Select(t =>t.SubTable.Select(st =>st.Value).FirstOrDefault(v =>v>0,-1));

@eiriktsarpalis@stephentoub How would you recommend going about this? It may be best to only update System.Linq for IEnumerable for now and make a separate issue for Queryable since it potentially involves updating more than just the Linq libraries to implement. Or I can implement a simplification like in the above sample and we just document that it can't be used in an inner query but rather only to return the final value.

Alternatively, if you two or anyone else has any ideas, I'm all ears. It may be possible to implement this in an appropriate manner, but I'm not entirely certain what that might look like.

Comment threadsrc/libraries/System.Linq/src/System/Linq/Last.cs Outdated
@eiriktsarpalis

Copy link
Copy Markdown
Member

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

@TheBrambleShark

Copy link
Copy Markdown
ContributorAuthor

@Foxtrek64 I rebased your branch and added fixes for the failing tests.

Seems a mix of me just being blind and missing a couple things and some random number being wrong somewhere that I would have never thought to look at. Glad we got that sorted.

@eiriktsarpalis
eiriktsarpalis merged commit 122c438 into dotnet:mainMar 18, 2021
@eiriktsarpalis

Copy link
Copy Markdown
Member

Thanks @Foxtrek64!

@ghostghost locked as resolved and limited conversation to collaborators Apr 17, 2021
@karelzkarelz added this to the 6.0.0 milestone May 20, 2021
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for specify return value on System.Linq.Enumerable.*OrDefault methods

4 participants

@TheBrambleShark@eiriktsarpalis@stephentoub@karelz