我的问题与此问题非常类似:如何将针对DTO的OData查询映射到EF实体? 我有一个简单的设置来测试ASP.NET Web API OData V4 $过滤器功能.我想做的是"别名"ProductDTO的一些属性以匹配Product实体的属性.用户将使用以下请求调用ProductsController:
GET产品?$ filter = DisplayName eq'test'
产品类:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int Level { get; set; }
public Product()
{ }
}
Run Code Online (Sandbox Code Playgroud)
ProductDTO类:
public class ProductDTO
{
public int Id { get; set; }
public string DisplayName { get; set; }
public int DisplayLevel { get; set; }
public ProductDTO(Product product)
{
this.DisplayName = product.Name;
this.DisplayLevel = product.Level; …Run Code Online (Sandbox Code Playgroud) 我有以下控制器,它应该接受用户名和密码作为POST中的有效负载.如果我将其更改为HttpGet它可以工作.
[RoutePrefix("api")]
public class AccountController : ApiController
{
[HttpPost("login/{username}/{password}")]
[AcceptVerbs("POST")]
public Login Login(string username, string password)
{
Login login = new Login();
if (username == "user" && password == "pw") login.Success = true;
else login.Success = false;
return login;
}
}
Run Code Online (Sandbox Code Playgroud)
OPTIONS请求可以通过,但POST失败.

选项标题:

选项回复:

POST标题:

POST响应:

知道我做错了什么吗?
我的问题类似于:web-api-odata-inlinecount-not-working
我安装了以下软件包:
<packages>
<package id="Microsoft.AspNet.Cors" version="5.0.0-rc1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.0.0-rc1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.0.0-rc1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.0.0-rc1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.OData" version="5.0.0-rc1" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.SelfHost" version="5.0.0-rc1" targetFramework="net45" />
<package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net45" />
<package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="5.0.6" targetFramework="net45" />
<package id="System.Spatial" version="5.6.0" targetFramework="net45" />
</packages>
Run Code Online (Sandbox Code Playgroud)
api是自动主机,启用了cors和属性路由.
// used for development purpose only
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
// enables attribute routing
config.MapHttpAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)
ProductController的方法GetAllProducts:
[Queryable]
[HttpGet("products")]
public PageResult<ProductViewModel> …Run Code Online (Sandbox Code Playgroud) 我有3个类,具有以下属性:
OfferList类:
Guid Id
IEnumerable<Offer> Offers
Run Code Online (Sandbox Code Playgroud)
优惠等级:
Guid Id
Product Product
bool IsSealed
Run Code Online (Sandbox Code Playgroud)
产品类别:
Guid Id
Run Code Online (Sandbox Code Playgroud)
OfferList包含多个Offer,而Offer具有精确的1个产品.
如何过滤OfferList以仅包含未密封的商品?
OfferList offerList = this.GetOfferList(id).Offers.Where(o => !o.IsSealed));
Run Code Online (Sandbox Code Playgroud)
这将返回一个类型为Offer的IEnumerable,而不是过滤OfferList.
是否可以在edmx文件中持久添加手动添加的存储过程?数据库是从模型生成的.每次我在edmx文件中的编辑器中更改某些内容时,存储过程都会丢失.之后只有FunctionImport条目可用.
示例函数如下所示:
<Function Name="SP_I_InsertGroup" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
<Parameter Name="name" Type="nvarchar" Mode="In" />
<Parameter Name="chiefId" Type="int" Mode="In" />
<Parameter Name="description" Type="nvarchar" Mode="In" />
<Parameter Name="parentId" Type="int" Mode="In" />
<Parameter Name="mode" Type="char" Mode="In" />
</Function>
Run Code Online (Sandbox Code Playgroud)
相应的FunctionImportMapping:
<FunctionImportMapping FunctionImportName="InsertGroup" FunctionName="DAL.Store.SP_I_InsertGroup" />
Run Code Online (Sandbox Code Playgroud)
FunctionImport:
<FunctionImport Name="InsertGroup" ReturnType="Collection(Int32)">
<Parameter Name="name" Mode="In" Type="String" />
<Parameter Name="chiefId" Mode="In" Type="Int32" />
<Parameter Name="description" Mode="In" Type="String" />
<Parameter Name="parentId" Mode="In" Type="Int32" />
<Parameter Name="mode" Mode="In" Type="String" />
</FunctionImport>
Run Code Online (Sandbox Code Playgroud) 我想将一个IQueryable和一组id传递给一个方法,该方法根据这些id过滤IQueryable.
由于id可以是long或int,因此应该通常解决.
我想出了以下内容:
public static IEnumerable<T> GetModified<TId, T>(IQueryable<T> objects, TId[] ids) where T : class
{
return objects.Where(j => ids.Contains((TId)j.GetType().GetProperty("Id").GetValue(j)));
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了例外:
LINQ to Entities无法识别方法'System.Object GetValue(System.Object)'方法,并且此方法无法转换为存储表达式.
我的问题与这个问题有关:linq-expression-with-generic-class-properties
这次我想得到新创建的具有共同id的对象.id实际上是外键,因此可以有不同的名称.
我想出了以下内容:
public static IEnumerable<T> GetNew<TId, T>(IQueryable<T> objects, TId id, DateTime date, Expression<Func<T, TId>> idSelector)
where T : class, ISyncable<TId>
{
return objects.Where(o => idSelector(o) == id && o.CreatedDate > date);
}
Run Code Online (Sandbox Code Playgroud)
该方法将被调用如下:
var modified = GetNew(dbObjects, id, date, entity => entity.PersonId);
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到了错误:
'idSelector' is a variable but is used like a method.
Run Code Online (Sandbox Code Playgroud)
传递给方法的表达式应该是这样的:
objects.Where(o => o.PersonId == id && o.CreatedDate > date);
Run Code Online (Sandbox Code Playgroud) 是否可以使用手动定义的值创建GUIDS?
我需要提前知道GUID的值来进行一些单元测试.
我想选择行,直到我找到一个数字的Id.如果我的数据按Id排序,问题可以很容易地解决.
Id Name
-----------
1 Bob
2 Eve
3 Alice
4 Michael
5 Anne
6 Mike
Run Code Online (Sandbox Code Playgroud)
要获取所有项目,直到找到Id 4,以下SQL语句就足够了:
SELECT * FROM Users WHERE Id <= 4
Run Code Online (Sandbox Code Playgroud)
如果数据按名称排序,我仍然希望获得项目,直到找到Id 4,我无法找到一个好的解决方案.
Id Name
-----------
3 Alice
5 Anne
1 Bob
2 Eve
4 Michael
6 Mike
Run Code Online (Sandbox Code Playgroud)
要定义的语句的输出应该是:
Id Name
-----------
3 Alice
5 Anne
1 Bob
2 Eve
4 Michael
Run Code Online (Sandbox Code Playgroud)
编辑1:
使用以下语句,输出几乎是我需要的,但缺少Id 4的项目.
queryable.OrderBy(o => o.Name).TakeWhile(o => o.Id != 4);
Id Name
-----------
3 Alice
5 Anne
1 Bob
2 Eve
Run Code Online (Sandbox Code Playgroud)
是否可以包含Id 4的项目? …
我有3个类,具有以下属性:
OfferList类:
Guid Id
IEnumerable<Offer> Offers
Run Code Online (Sandbox Code Playgroud)
优惠等级:
Guid Id
Product Product
Run Code Online (Sandbox Code Playgroud)
产品类别:
Guid Id
Run Code Online (Sandbox Code Playgroud)
OfferList包含多个Offer,而Offer具有精确的1个产品.
如何获得包含OfferList的所有产品的IEnumerable?
OfferList offerList = this.GetOfferList(id);
IEnumerable<Product> products = offerList.Offers.SelectMany?
Run Code Online (Sandbox Code Playgroud) 我有以下列表:
根应该是可折叠的,但不是孩子.如果单击其中一个代码,则以下代码将崩溃.如何防止儿童瘫倒?
<li data-toggle="collapse" data-target="#root"><a href="#">Root</a>
<ul class="nav nav-list collapse" id="root">
<li><a href="some_url">Child1</a></li>
<li><a href="some_url">Child2</a></li>
</ul>
</li>
Run Code Online (Sandbox Code Playgroud)
编辑:更好地描述我想要的方法.
jsfiddle:http://jsfiddle.net/MgcDU/4537/