在关于上述和/或包括其他的方法,如果你正在寻找一个记录,且只有一个记录存在,其中之一将执行的最快?例如,我要确保,一旦发现被查询的价值,我正在寻找一个将返回它的时候了,而无需通过剩余的记录搜索.
我有一个示例代码,它调用 SingleOrDefault 方法 3 次,并在任何序列具有多个匹配元素时记录异常。
如果我想检查此代码的哪一部分引发异常,问题就开始了。
是否可以从此异常中获取一些有用的信息,例如谓词参数或集合类型以进行更详细的跟踪?
像这样 -序列包含多个匹配元素。集合 IEnumrable|ParamType| param {谓词参数 toString()}
public void GetSingleOrDefaultTest(){
try{
var user = Users.SingleOrDefault(e => e.Id == 1);
var profile = UserProfiles.SingleOrDefault(e => e.Id == 1);
var profile2 = UserProfiles.SingleOrDefault(e => e.Id == 2);
} catch(InvalidOperationException ex){
Log(ex);
}
}
Run Code Online (Sandbox Code Playgroud) 我目前在我的控制器中使用以下代码:
Instructor instructor = db.Instructors.FirstOrDefault(
o => o.UserName == User.Identity.Name);
Run Code Online (Sandbox Code Playgroud)
用户名选择某人.我的理解是,如果我的用户具有相似的用户名,我将无法使用"FirstOrDefault()"(当我有名为"MrUserOne"的用户搜索"MrUser"时,"MrUserTwo"和"MrUser"可能会产生"MrUserOne",因为这是"第一个"出现的搜索结果),如果我对"FirstOrDefault"未来遇到的困难的理解是正确的,我应该在它的位置使用什么?
或者我对FirstOrDefault如何运作的理解错了?
我正在使用asp.net mvc-4 Web应用程序,我正在使用Entity Framework 5.现在我有以下模型方法: -
public IQueryable<TMSStorageDevice> CustomerSD(int customerid)
{
var customerSiteIds = entities.SiteDefinitions.Where(a => a.AccountDefinitions1.SingleOrDefault().ORG_ID == customerid).Select(a2 => a2.SITEID).ToList();
}
Run Code Online (Sandbox Code Playgroud)
现在这会引发以下错误: -
System.NotSupportedException was unhandled by user code
HResult=-2146233067
Message=The methods 'Single' and 'SingleOrDefault' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.
Source=System.Data.Entity
StackTrace:
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SingleTranslatorBase.TranslateUnary(ExpressionConverter parent, DbExpression operand, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConver
Run Code Online (Sandbox Code Playgroud)
我能够通过替换(SingleOrDefault())解决这个问题: -
a.AccountDefinitions1.SingleOrDefault().ORG_ID
Run Code Online (Sandbox Code Playgroud)
with(FirstOrDefault()): -
a.AccountDefinitions1.FirsteOrDefault().ORG_ID …Run Code Online (Sandbox Code Playgroud) 我正在使用.NetCore 1.1.2.当我为GET动作使用生成的动作时,它应该在DB上没有找到任何内容时返回null,但是Null验证不起作用.
我尝试使用Single()而不是SingleOrDefault使用try catch来抛出异常,但它似乎不是一个优雅的解决方案.
也许这是.net版本?
public IActionResult Success(string token)
{
var paymentMade = _context.Payments
.SingleOrDefaultAsync(m => m.StripeToken == token);
if (paymentMade == null)
{
return NotFound(); //this never gets fired when empty
}
return View();
}
Run Code Online (Sandbox Code Playgroud) 如果我知道集合中只有一个匹配的项目,是否有任何方法可以告诉Linq这样,以便在找到它时中止搜索?
我假设这两个在返回一个项目之前搜索完整的集合?
var fred = _people.Where((p) => p.Name == "Fred").First();
var bill = _people.Where((p) => p.Name == "Bill").Take(1);
Run Code Online (Sandbox Code Playgroud)
编辑:人们似乎注意到FirstOrDefault,或SingleOrDefault.这些与我的问题无关.如果集合为空,它们只是提供默认值.正如我所说,我知道我的收藏品有一个匹配的项目.
AakashM的评论对我来说最感兴趣.我觉得我的假设是错的,但我很感兴趣.例如,当linq to objects在我的示例代码中运行Where()函数时,它如何知道对其返回值有进一步的操作?
我有不同的列的列表,Name和Bitrate.
public class VideoQuality
{
public string Name { get; set; }
public string Bitrate { get; set; }
}
public List<VideoQuality> quality = new List<VideoQuality>()
{
new VideoQuality() { Name = "High", Bitrate = "5000K" },
new VideoQuality() { Name = "Medium", Bitrate = "2500K" },
new VideoQuality() { Name = "Low", Bitrate = "500K" },
};
Run Code Online (Sandbox Code Playgroud)
如何从在列表中选择Bitrate是High?
就像是:
if (selectedQuality == "High")
{
// Select High Bitrate from List
string …Run Code Online (Sandbox Code Playgroud) 作为LINQ的新手,我创建了几个查询,并希望将它们组合成一个,但我不知道该怎么做.他们来了:
var u = dc.Users.Where(w => w.UserName == userName).SingleOrDefault();
var m = dc.Memberships.Where(w => w.UserId == u.UserId).SingleOrDefault();
m.PasswordQuestion = securityQuestion;
m.PasswordAnswer = securityAnswer;
dc.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
dc.Users是aspnet_Users表
dc.Membership是aspnet_Membership表
另外,SingleOrDefault和之间有什么区别FirstOrDefault?
c# ×7
linq ×6
.net ×3
asp.net-mvc ×2
asp.net ×1
asp.net-core ×1
linq-to-sql ×1
list ×1
take ×1