我将POCO对象传递给将创建新实体的方法。 DB中的某些字段允许为空。创建实体,我必须根据其中一个字段进行查找。好吧,这个查找可能会返回null,这不允许我在主要实体添加期间引用它的属性。请参阅下面的代码
Location origin = new Location()
{
Order = o,
LocationTypeKey = ctx.LocationTypes.Where(a => a.TypeName == "Origin").First().LocationTypeId,
Address1 = " test address 1",
Address2 = " test Address 2",
City = oi.OriginCity,
StateKey = ctx.States.Where(a => a.StateName == oi.OriginState).First() == null ? 9999 : ctx.States.Where(a => a.StateName == oi.OriginState).First().StateId,
CountryKey = ctx.Countries.Where(a => a.CountryName == oi.OriginCountry).First().CountryId
};
ctx.Locations.Add(origin);
注意我正在尝试默认StateKey的值,如果我的状态cant的POCO值导致查找表(状态)中的匹配值。
这不起作用,我仍然在处理“Sequence contains no entites”的调用者中遇到异常。当我逐步执行代码时,它在我正在尝试条件空检查的那一行失败。
有更好的方法吗?
答案 0 :(得分:1)
这里有一些很好的答案,建议FirstOrDefault()
可以防止空值;但是,这是另一种选择:
StateKey = ctx.States
.Where(a => a.StateName == oi.OriginState).Any()
? ctx.States.Where(a => a.StateName == oi.OriginState).FirstOrDefault().StateId
:9999,
答案 1 :(得分:0)
问题是如果没有实体,.First()
方法将失败。一个简单的解决方法是改为调用.FirstOrDefault()
。
但是,值得注意的是,编写的代码所做的工作比它需要的工作多得多 - 五次往返数据库,其中两次是重复的,所有这些都比你提供更多的信息需要。
更重要的是,使用9999作为没有相应州/国家的代码似乎是一个真的不好的想法。为什么没有可以为空的键值呢?
将StateKey
和CountryKey
更改为可为空的整数,然后是改进版本:
Location origin = new Location()
{
Order = o,
LocationTypeKey = ctx.LocationTypes
.Where(a => a.TypeName == "Origin")
.Select(a => a.LocationTypeId)
.First(),
Address1 = " test address 1",
Address2 = " test Address 2",
City = oi.OriginCity,
StateKey = ctx.States.Where(a => a.StateName == oi.OriginState)
.Select(a => (int?)a.StateId)
.FirstOrDefault(),
CountryKey = ctx.Countries.Where(a => a.CountryName == oi.OriginCountry)
.Select(a => (int?)a.CountryId)
.FirstOrDefault()
};
答案 2 :(得分:0)
尝试使用.FirstOrDefault()
,如果没有数据,它将返回null
,但.First()
只会抛出异常
StateKey = ctx.States.Where(a => a.StateName == oi.OriginState).FirstOrDefault() == null ? 9999 : ctx.States.Where(a => a.StateName == oi.OriginState).First().StateId
答案 3 :(得分:0)
实际上,这就是我想要使用的。注意我比较count而不是null
Location origin = new Location()
{
Order = o,
LocationTypeKey = ctx.LocationTypes.Where(a => a.TypeName == "Origin").First().LocationTypeId,
Address1 = " test address 1",
Address2 = " test Address 2",
City = oi.OriginCity,
StateKey = ctx.States.Where(a => a.StateName == oi.OriginState).Count() == 0 ? 9999 : ctx.States.Where(a => a.StateName == oi.OriginState).First().StateId,
CountryKey = ctx.Countries.Where(a => a.CountryName == oi.OriginCountry).First().CountryId
};
ctx.Locations.Add(origin);