我正在构建一个存储库,我在很多地方看到过2个不在存储库外暴露IQueryable的原因.
1)首先是因为不同的LINQ提供程序可能表现不同,这种差异应该包含在存储库中.
2)第二是防止服务级别开发人员修改数据库查询,以免意外导致性能问题.
我想问题2只能通过将所有查询逻辑保留在存储库中并且不允许任何形式的外部查询构建来防止?但这对我来说似乎有点不切实际.
问题1似乎可以通过使用数据对象模式来解决.
例如 public IEnumerable<T> FindBy(Query query)
我的问题是,为什么我不仅仅传递一个lambda表达式,因为它与提供者无关,似乎为我提供了与查询对象相同的功能,以及相同的分离级别?
例如 public IEnumerable<T> FindBy(Expression<Func<T,bool>> predicate)
有什么理由不这样做吗?它违反了一些规则吗?最佳做法?我应该知道什么?
我想知道这是否可行,如果是的话,我确定它是一个简单的解决方案,我似乎无法弄清楚
@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)
Run Code Online (Sandbox Code Playgroud)
基本上对于这个玩具示例,我试图选择一个列包含[任何文本] thingName [anyText]的行.当如上使用时,我认为引号模糊了绑定变量,因此它实际上查找[任何文本] :thingName [anyText]而不是我的绑定变量.
先谢谢你,Madeline
我有一个DBQuery<T>转换为IQueryable<T>(这一点工作正常).但后来我试图将IQueryable转换为ObjectQuery ..它失败了: -
public void Foo(this IQueryable<T> source)
{
// ... snip ...
ObjectQuery<T> objectQuery = source as ObjectQuery<T>;
if (objectQuery != null)
{
// ... do stuff ...
}
}
Run Code Online (Sandbox Code Playgroud)
在我转换到Entity-Framework 4 CTP5 Magic Unicorn等等之前,这曾经工作过.现在,它不起作用 - 即.objectQuery是null.
现在,DBQuery<T> inherits IQueryable<T>..所以我认为这应该工作.
如果我将代码更改为..
var x = (ObjectQuery<T>) source;
Run Code Online (Sandbox Code Playgroud)
然后抛出以下异常: -
System.InvalidCastException:无法转换类型为'System.Data.Entity.Infrastructure.DbQuery
1[Tests.Models.Order]' to type 'System.Data.Objects.ObjectQuery1 [Tests.Models.Order]'的对象.
有什么建议?
我正在开发一个WebService,它将linq转换为sql db并将结果放入VAR变量中.然后我想使用javascript序列化程序(c#)将VAR中的结果序列化为json格式.像这样的东西:
var sb= from p in ent.people .........
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(sb.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, sb);
string json = System.Text.Encoding.Default.GetString(ms.ToArray());
Run Code Online (Sandbox Code Playgroud)
但是我得到了一个像这样的错误回应:
Type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType2d`5[System.String,System.Nu llable`1[System.Int32],System.Nullable`1[System.Int32],System.Int32,System.String]]' cannot be serialized.
Run Code Online (Sandbox Code Playgroud)
请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.
我如何直接将LINQ结果串行化为JSON?非常感谢所有答案!恩里科
我正在尝试使用带有EntitySQL查询的EntityObject从MSSQL DB中获取一些记录.我用来过滤的字段是日期时间的类型.生成的查询在没有毫秒的情况下投射到SQL Server,不返回任何内容.当我添加毫秒时,我得到结果.
如何在没有毫秒的情况下使用EntitySQL获取结果?
谢谢.
有人可以帮我回答如何用ObjectQuery bilder重写原始SQL过滤器WHERE(...)OR(...),好吗?
String queryRaw = "SELECT ls.LocaleName, ls.IsActive, ls.LocaleDescription " +
"FROM RoutesEntities.Locales AS ls ";
//" WHERE ls.LocaleName = 'en' OR ls.LocaleName = 'de' "
this._queryData = new ObjectQuery<DbDataRecord>(queryRaw, routesModel);
Run Code Online (Sandbox Code Playgroud)
我会使用Where()方法,但它生成where子句用AND分隔,但我想使用OR代替.是否可以使用QueryBilder?我的意思是如何使用它来生成"OR分离"过滤器:
Where("it.LocaleName IN (@localeName)", new ObjectParameter("localeName", String.Join(",", localeName)))
Run Code Online (Sandbox Code Playgroud)
谢谢,阿尔乔姆
我正在尝试在这篇文章中应用建议:提示22 - 如何使Include真正包括在内
它建议在实体框架(4.2)中确保急切加载的解决方法.该解决方法涉及将IQueryable转换为ObjectQuery.
但是,当我尝试这个时,如帖子所示,查询返回null.
我的查询是(ctx是DbContext):
IEnumerable<Coupon> coupons =
from x in ctx.Coupons
where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate
select x;
Run Code Online (Sandbox Code Playgroud)
这按预期工作.
但是,当我使用时,
IEnumerable<Coupon> coupons =
(from x in ctx.Coupons
where x.LanguageCode.Equals("EN", StringComparison.InvariantCultureIgnoreCase) && x.CategoryId == MainCategoryId && x.Date >= fromDate && x.Date <= toDate
select x) as ObjectQuery<Coupon>;
Run Code Online (Sandbox Code Playgroud)
它为"优惠券"指定了一个空值.
知道我做错了什么吗?
我在IQueryable上有一个扩展,允许传递分隔的属性名称字符串,当使用时会导致查询不构造JOIN并有效地导致SELECT N + 1问题.
我注意到的是,如果我直接从DbSet调用本机EF扩展名.Include("property"),一切正常.但是,如果我使用我的扩展(我甚至简化它只是调用.Include("property")SELECT N + 1发生...
我的问题是为什么?我究竟做错了什么?
这是调用方法(来自服务)
public MyModel[] GetAll(int page, out int total, int pageSize, string sort, string filter)
{
return _myModelRepository
.Get(page, out total, pageSize, sort, filter, "PropertyOnMyModelToInclude")
.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
这是使用扩展的存储库方法
public virtual IQueryable<T> Get(int page, out int total, int pageSize, string sort, string filter = null, string includes = null)
{
IQueryable<T> query = DatabaseSet;
if (!String.IsNullOrWhiteSpace(includes))
{
//query.IncludeMany(includes); // BAD: SELECT N+1
//query.Include(includes); // BAD: SELECT N+1
}
if (!String.IsNullOrWhiteSpace(filter))
{
query.Where(filter);
} …Run Code Online (Sandbox Code Playgroud) 如何在这里传递日期时间值?
ObjectQuery<Item> _Query = ItemEntities.CreateQuery<Item>("Item");
_Query = _Query.Where("(it.StartDate >= 11/4/2009 5:06:08 PM)");
Run Code Online (Sandbox Code Playgroud)
我上面的示例代码似乎确实有效.
即便如此
ObjectQuery<Item> _Query = ItemEntities.CreateQuery<Item>("Item");
_Query = _Query.Where("(it.StartDate >= \"11/4/2009 5:06:08 PM\")");
Run Code Online (Sandbox Code Playgroud)
我在EDM中遇到了类型转换错误.
我需要从此查询中获取UserCarId(int)并分配给int类型变量.
int UserCarId;
Entities ctx = new Entities();
var query = from enq in ctx.UserCars.Include("aspnet_Users")
where enq.aspnet_Users.UserId == currentUserId
select enq.UserCarId ;
UserCarId = query;
Run Code Online (Sandbox Code Playgroud) 我一直在阅读时使用LINQ来IQueryable处理查询在处理之前的类型,但是当查询处理完毕后,它不再是一个IQueryable,而是一个ObjectQuery.
在这种情况下,从我的层(存储库层)编写方法以返回IQueryable是否正确?
我需要演员吗?
我为什么要退货ObjectQuery?
我来自LINQ to SQL背景,IQueryable但事情总是如此,但EF似乎改变了这一点.
任何帮助真的很感激.
linq-to-entities entity-framework iqueryable objectquery entity-framework-4
我正试图掌握实体框架,有一件事真的让我感到沮丧.我仍然不完全确定术语并没有帮助,我试图避免同时学习LINQ,因此谷歌搜索是困难的.
我有两个表,公司和地址与1对多的关系.如果我写下面的内容:
ObjectQuery<Company> companies = queryContext.Companies.Include("Addresses");
Run Code Online (Sandbox Code Playgroud)
看起来我得到了我想要的东西(公司 - >结果视图[0] .Addresses.Count> 0)
我现在要做的是将公司名称和所有地址绑定到ASP.NET应用程序中的gridview
this.CompaniesGrid.DataSource = companies;
this.CompaniesGrid.DataBind();
Run Code Online (Sandbox Code Playgroud)
<asp:GridView runat="server" ID="CompaniesGrid" AllowSorting="true">
<Columns>
<asp:BoundField DataField="Name" />
<asp:BoundField DataField="Address" />
</Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)
这本身就会抛出一个错误(A field or property with the name 'Address' was not found on the selected data source) - 我认为因为公司 - >结果视图[0] .Name存在但.Address不存在(因为它隐藏在地址关系中).绑定到Addresses.Address也没有帮助.
我在这个帖子的底部发现了一个非常难看的解决方法,但如果可能的话我宁愿避免使用它.
有没有办法'展平'我的结果,以便顶级对象为所有包含的字段提供加入?
任何帮助非常感谢!
objectquery ×12
c# ×6
iqueryable ×3
.net ×2
asp.net ×2
dynamic-linq ×1
filter ×1
jdbi ×1
json ×1
linq ×1
sql ×1
t-sql ×1
where ×1