我想提供一组过滤器供用户选择,每个过滤器都对应一个Expression<Func<X, bool>>.因此,我可能想要获取可用项目的动态列表('Joe','Steve','Pete'等),并根据这些名称创建一组"硬编码"过滤器,并让用户选择他想要使用哪个过滤器.我的问题是,即使我尝试根据动态列表中的字符串值"硬编码"我的表达式,表达式仍然存储值为,看起来是什么,一个悬挂在匿名类型上的属性(和我不知道如何序列化anon.类型).对不起,如果这令人困惑,我不太清楚如何表达这一点.
这是我的示例代码:
public class Foo
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Foo[] source = new Foo[]
{
new Foo() { Name = "Steven" } ,
new Foo() { Name = "John" } ,
new Foo() { Name = "Pete" },
};
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
Expression<Func<Foo, bool>> exp = x => x.Name == f.Name;
filterLst.Add(exp);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我看到表达的主体时,它看起来如下:
(x.Name …Run Code Online (Sandbox Code Playgroud) 我在找出最佳方法时遇到了一些麻烦,我将不胜感激.
基本上,我正在设置一个过滤器,允许用户查看与用户名的任意"过滤器"相关联的审计项目的历史记录.
数据源是SQL Server数据库,因此我将使用IQueryable"source"(来自db上下文对象的直接表引用,或者可能是由其他查询产生的IQueryable),应用WHERE过滤器,然后返回由此产生的IQueryable对象......但是我对如何使用这种方法执行OR感到有点困惑.
我已经考虑过表达式的路径了,因为我知道如何对它们进行OR,但是我还是无法通过"包含"类型的评估来弄清楚如何做到这一点,所以我目前正在使用UNION,但是我担心这可能会对性能产生负面影响,我想知道如果在arbirary顺序中添加其他过滤器(除了此处显示的用户名过滤),它是否可能无法完全满足我的要求.
这是我的示例代码:
public override IQueryable<X> ApplyFilter<X>(IQueryable<X> source)
{
// Take allowed values...
List<string> searchStrings = new List<string>();
// <SNIP> (This just populates my list of search strings)
IQueryable<X> oReturn = null;
// Step through each iteration, and perform a 'LIKE %value%' query
string[] searchArray = searchStrings.ToArray();
for (int i = 0; i < searchArray.Length; i++)
{
string value = searchArray[i];
if (i == 0)
// For first step, perform direct WHERE
oReturn = source.Where(x => x.Username.Contains(value)); …Run Code Online (Sandbox Code Playgroud) 我刚刚尝试使用Entity Framework,但我对DBSet Object的某些行为感到有些困惑.当我调用Find()方法时,它似乎知道我最近添加(但尚未保存)的项目集合,但是当我尝试查询DBSet时,它似乎只包含一直存在的项目.有一种简单的方法可以解决这个问题吗?我包含了一些我尝试解决此问题的代码,但是当它开始迭代我的"已添加"更改集中的项目时,我收到此错误:
"无法创建EntityType类型的常量值.在此上下文中仅支持基本类型(例如Int32,String和Guid')."
internal DbContext Context { get; set; }
protected DbSet<T> DBSet { get; set; }
public virtual IEnumerable<T> Get(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
bool ignoreCachedChanges = false)
{
IQueryable<T> oReturn = DBSet;
// This block is intended to adjust the queryable source to account for changes
if (!ignoreCachedChanges)
{
oReturn = oReturn.Except(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Deleted).Select(x => x.Entity));
oReturn = oReturn.Union(Context.ChangeTracker.Entries<T>().Where(x => x.State == System.Data.EntityState.Added).Select(x => x.Entity));
}
if (filter != …Run Code Online (Sandbox Code Playgroud) 我目前正在开展一个项目,在该项目中我们使用关键字对地点执行“附近”查询,然后我们提出后续“详细信息”请求以获取有关特定景点的更多信息。
随着 Google 的新定价模型在工作中,文档警告了 Nearby 搜索的成本,但该警告似乎暗示后续详细信息请求将不再是必要的,因为我们的原始搜索应该为我们提供了我们需要的一切:
默认情况下,当用户选择一个地点时,附近搜索会返回所选地点的所有可用数据字段,您将被相应地计费。无法将附近搜索请求限制为仅返回特定字段。为了避免请求(和支付)您不需要的数据,请改用 Find Place 请求。
但是,我没有看到这一点。当我运行示例请求时,我的 Nearby 请求的结果仅包含与 Google 找到的地点相关的最少数据。要获取详细信息,我仍然需要做一个后续的详细信息请求。
有谁知道我可能会忽略什么?我包括我的请求 URL(无 API 密钥)。
这是我收到的结果之一的示例:
{
"geometry": {
"location": {
"lat": 30.69254,
"lng": -88.0443999
},
"viewport": {
"northeast": {
"lat": 30.69387672989272,
"lng": -88.04309162010728
},
"southwest": {
"lat": 30.69117707010728,
"lng": -88.04579127989273
}
}
},
"icon": "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
"id": "53744cdc03f8a9726593a767424b14f7f8f86049",
"name": "Ann M Hartwell - Aflac Insurance Agent",
"place_id": "ChIJj29KxNZPmogRJovoXjMDpQI",
"plus_code": {
"compound_code": "MXV4+26 Mobile, Alabama",
"global_code": "862HMXV4+26"
},
"reference": "CmRbAAAAcHM1P7KgNiZgVOm1pWojLto9Bqx96h2BkA-IyfN5oAz1-OICsRXiZOgwmwHb-eX7z679eFjpzPzey0brgect1UMsAiyawKpb5NLlgr_Pk8wBJpagRcKQF1VSvEm7Nq6CEhCfR0pM5wiiwpqAE1eE6eCRGhQPJfQWcWllOVQ5e1yVpZYbCsD01w",
"scope": "GOOGLE",
"types": [ …Run Code Online (Sandbox Code Playgroud) 我正在尝试对一个不幸具有高度单位相互依赖性的项目进行一些单元测试.目前,我们的很多类都在寻找自定义UserIdentity对象来确定身份验证,但是该对象有很多内部环绕跳跃,我在试图测试单个单元功能时会尽快避免.
为了解决其中一些问题,我正在尝试创建一个UserIdentity的"模拟"版本,可以通过更严格控制的变量环境插入.
简而言之,我们有一个UserIdentity类,它有几个公共只读属性和一个静态CurrentIdentity(IIdentity)占位符.我可以通过"模拟" IIdentity实现来解决所有问题,但是当我达到将CurrentIdentity作为UserIdentity进行投射时,我遇到了障碍.
这是一个非常简单的方法:
internal static UserIdentity GetCurrentIdentity()
{
UserIdentity currentIdentity = ApplicationContext.User.Identity as UserIdentity;
return currentIdentity;
}
Run Code Online (Sandbox Code Playgroud)
我已经设置了我的模拟对象来创建UserIdentity类型的成员,然后执行以下操作:
public static implicit operator UserIdentity(MockUserIdentity src)
{
return src.UserIdentity;
}
Run Code Online (Sandbox Code Playgroud)
或这个
public static explicit operator UserIdentity(MockUserIdentity src)
{
return src.UserIdentity;
}
Run Code Online (Sandbox Code Playgroud)
问题是,据我所知,'as'似乎没有在我的模拟对象上调用隐式或显式转换操作.我的问题是(是吗?),我在这里遗漏了一些简单的东西,或者这不起作用,因为(我猜)'as'操作直接看到类继承(我的对象不做...) ?
此外,可能有点偏离主题,但为什么在类中不能同时使用相同结果类型的显式和隐式运算符?除非我遗漏了一些愚蠢的东西,否则如果我尝试同时拥有两个转换运算符,编译器就会黯然失色.我必须选择一个或另一个.
UPDATE
好的,现在我完全糊涂了.也许我变得邋,,但我已经尝试过做直接演员,我似乎无法让它发挥作用.我在MSDN上阅读了运算符,示例显示运算符进入结果类而不是源类,但我不确定这是否重要(我在下面的代码中尝试了两个位置).无论哪种方式,我试图建立一个简单的试验台,看看我可能做错了什么,但我也无法让它工作......这就是我所拥有的
class Program
{
// Shared Interface
public interface IIdentity { }
// "real" class (not conducive to inheritence)
public class CoreIdentity : IIdentity …Run Code Online (Sandbox Code Playgroud) 当试图从IEnumerable对象集合中获取对象数组时(与我想要的数组不同),我知道我可以先将源集合转换为正确的类型,然后从中获取一个数组,但是方法ToArray<T>()给出了我认为它可以一步完成这两项操作.但是,从我的经验来看,我从来没有找到过这种ToArray<T>()方法适用于任何T 的情况,除了原始来源的T(在我看来,这是ToArray<T>()愚蠢的,因为它与非泛型ToArray做同样的事情))已经).
所以我的问题是,我是否错过了该ToArray<T>()方法的重点,并且我试图让它做一些它从未打算过的事情,或者是否有一些愚蠢的我在方法方面缺少什么,以及我是什么试图做的事情一般都遵循其意图吗?
这是一个具体的例子来说明我的问题:
public interface IFoo { }
public class Foo : IFoo { }
static void Main(string[] args)
{
// Suppose a list of Foos was created
List<Foo> src = new List<Foo>();
// I would be safe obtaining an array of IFoos from that list, but
// This is not supported (although intellisense shows the method is there, the compiler balks):
// IFoo[] results …Run Code Online (Sandbox Code Playgroud)