我正在尝试创建一个在我的基类中用于我的存储库的通用方法,而且我遇到了问题。这是方法......
public virtual T First(System.Linq.Expressions.Expression<Func<T, bool>> where, List<string> properties)
{
IQueryable<T> query = null;
if (where != null)
{
query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())).Where(where);
}
else
{
query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString()));
}
foreach (string s in properties)
{
query = query.Include(s);
}
T _result = (T)query.First();
return _result;
}
当我运行代码时,它给了我这个错误:
'公司'无法解决 当前的范围或背景。使 确保所有引用的变量都是 在范围内,所需的模式是 加载,并且名称空间是 正确引用。几乎逃脱了 标识符,第1行,第1列。
我知道为什么会这样做,我只是不知道如何修复它。我认为它正在这样做,因为我的ObjectContext不知道对象“公司”,但它确实知道“公司”。关于如何解决这个问题的任何想法??
错误发生在这一行:
T _result =(T)query.First();
谢谢!
答案 0 :(得分:7)
Dan,使用以下内容获取实体集名称:
string entitySetName = context.MetadataWorkspace
.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace)
.BaseEntitySets.Where(bes => bes.ElementType.Name == typeof(T).Name).First().Name;
string name = String.Format("{0}.{1}", context.DefaultContainerName, entitySetName);
query = context.CreateQuery<T>(name).Where(where);
执行此操作将解析查询的正确复数名称。
使用Yury的方法是最好的选择。
编辑顺便说一下,如果查询没有返回任何实体(它将抛出FirstOrDefault()
),则应返回First()
而不是InvalidOperationException
。< / p>
答案 1 :(得分:6)
尝试使用
query = _context.CreateObjectSet<T>().Where(where);
而不是
query = _context.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name.ToString())).Where(where);